package com.sise.Linked;

import java.util.Stack;

/**
 *      经典快慢指针：让快指针先走 k 步，然后一同起步，直到快指针到达终点，那么慢指针距离终点就是 k 个距离了
 *
 *      面试题 02.02. 返回倒数第 k 个节点
 *      实现一种算法，找出单向链表中倒数第 k 个节点。返回该节点的值。
 *
 *
 *      另一种解法：使用栈解决
 *      这题要求的是返回后面的k个节点，我们只要把原链表的结点全部压栈，然后再把栈中最上面的k个节点出栈，出栈的结点重新串成一个新的链表即可，原理也比较简单，直接看下代码。
 *
 */
public class _02_02_inter_kthToLast {
    public int kthToLast(ListNode head, int k) {

        // 让快指针先走 k 步
        ListNode fast = head;
        for (int i = 0; i < k; i++){
            fast = fast.next;
        }

        // 直到快指针到达终点，那么慢指针距离终点就是 k 个距离
        while (fast != null){
            fast = fast.next;
            head = head.next;
        }
        return head.val;
    }


    /**
     * 第二种解法： 栈
     */
    public int kthToLast2(ListNode head, int k) {
        Stack<ListNode> stack = new Stack<>();
        //链表节点压栈
        while (head != null) {
            stack.push(head);
            head = head.next;
        }
        //在出栈串成新的链表
        ListNode firstNode = stack.pop();
        while (--k > 0) {
            ListNode temp = stack.pop();
            temp.next = firstNode;
            firstNode = temp;
        }
        return firstNode.val;
    }
}
